描画環境 周りのリファクタリング(Rust製ラスタライザ)
目次
ファイル分離
AC.icon ウィンドウへの描画を管理するCanvas構造体を作る。 次のメソッドを持つ
new(width, height) ... ウィンドウを立ち上げる
draw_point(p1, color)
draw_line(p1, p2, color)
AC.icon ファイル分離
code:tree
src
| canvas.rs
| canvas
| | base.rs
| | draw_line.rs
| util.rs
| util
| | point2.rs
| | vec3.rs
| main.rs
code:util.rs
mod point2;
mod vec3;
pub use point2::*;
pub use vec3::*;
pub fn in_range<T: PartialOrd>(begin: T, x: T, end: T) -> bool { ... }
pub type Throwable<T> = Result<T, Box<dyn std::error::Error>>;
code:rs
// Canvas構造体の定義とdraw_pixel関数などの基本メソッドを定義
// newメソッド・updateメソッドでminifbの初期化・更新を行う。
mod base;
// 線分描画アルゴリズムをCanvasのメソッドとして定義
mod draw_line;
pub use base::Canvas;
code:main.rs
mod util;
mod canvas;
use std::f64::consts::PI;
use canvas::Canvas;
use util::{Throwable, Color, Point2};
const WIDTH: usize = 640;
const HEIGHT: usize = 480;
fn main() -> Throwable<()> {
let mut canvas = Canvas::new(WIDTH, HEIGHT)?;
while canvas.update()? {
for i in 0..50 {
let theta = -PI/2.0 + (i as f64) * 2.0*PI / 50.0;
let r = (HEIGHT as f64) / 2.0;
let p1 = Point2::new((WIDTH as i32) / 2, (HEIGHT as i32) / 2);
let p2 = Point2::new(
(p1.x as f64 + r * f64::cos(theta)).floor() as i32,
(p1.y as f64 + r * f64::sin(theta)).floor() as i32
);
canvas.draw_line(&p1, &p2, &Color::new(1., 1., 1.));
}
}
Ok(())
}
このモジュール分割法でいいのだろうかappbird.icon